import subprocess

from log 	import Log
from dados 	import Dados
from dados_real import DadosReal
from const 	import Const

class Executor:
	def __init__(self, id, id_processamento, id_sistema):
		self.id			= id
		self.id_processamento	= id_processamento
		self.id_sistema		= id_sistema
		self.log 		= Log()
		self.dados 		= Dados()
		self.dados_real 	= DadosReal()
		self.CONST		= Const()
		flag_erro=0
		self.setStatus(self.CONST.PROCESSANDO)
		self.log.update('iniciando executor['+ str(id) +']...\n')
		# Obtendo o path dos scripts e binarios de execucao
		path_comando=self.dados_real.getPathExecutor(id, id_sistema)
		self.log.update('path_comando=' + str(path_comando) + '\n')
		parametros_entrada=self.dados.getParametrosEntrada(self.id_sistema, self.id_processamento)
		# Varrendo as tarefas deste executor
		tarefas	= self.dados.getTarefas(id)
		for t in tarefas:
			id_tarefa	=t[0]
			nome_tarefa	=t[2]
			self.log.update('executando tarefa=' + str(nome_tarefa) + '\n')
			# obtem o comando shell com cada parametro dentro de um elemento do array
			comando=self.dados_real.getTarefa(id, id_tarefa)
			parametros=self.dados_real.getTarefaParametros(id_tarefa, self.id, self.id_sistema)
			self.setTarefaStatus(id_tarefa,self.CONST.PROCESSANDO)
			# executa o comando no shell e espera o retorno
			self.log.update('executando tarefa=' + path_comando + '/' + comando + ' ' + parametros + ' ' + parametros_entrada + '\n')
			#retorno=subprocess.call(path_comando + '/' + comando + ' | tee -a /tmp/processador.log 2>&1', shell=True, stderr=subprocess.STDOUT)
			retorno=subprocess.call(path_comando + '/' + comando + ' ' + parametros + ' ' + parametros_entrada + ' >> /tmp/processador.log 2>&1', shell=True, stderr=subprocess.STDOUT)
			if(retorno == 0):
				self.log.update('tarefa bem sucedida!\n')
				self.setTarefaStatus(id_tarefa,self.CONST.FINALIZADO)
			else:
				self.log.update('###################\n')
				self.log.update('TAREFA COM ERRO=' + str(retorno) + '\n')
				self.log.update('###################\n')
				self.setTarefaStatus(id_tarefa,self.CONST.ERRO)
				flag_erro=1
		if(flag_erro==0):	
			self.setStatus(self.CONST.FINALIZADO)
		else:
			self.setStatus(self.CONST.ERRO)
		self.log.update('Finalizando executor['+ str(id) +'][status:' + str(self.getStatus()) + ']...\n')
		
	def setStatus(self, s):
		self.status=s
	def getStatus(self):
		return self.status
	def setTarefaStatus(self, id_tarefa, s):
		self.dados_real.setTarefaStatus(id_tarefa, self.id, self.id_processamento,s)
